#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
	int res=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){res=(res<<1)+(res<<3)+(c^48);c=getchar();}
	return res*f;
}
void write(int x)
{
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
int n,m;
struct Nene
{
	struct node
	{
		int nxt,to;
	}e[114514<<1];
	int head[114514],cnt_edge;
	void add_edge(int u,int v)
	{
		e[++cnt_edge].to=v;
		e[cnt_edge].nxt=head[u];
		head[u]=cnt_edge;
	}
	int siz[114514],dep[114514],f[114514][20];
	void dfs(int u,int fa)
	{
		dep[u]=dep[fa]+1;
		siz[u]=1;
		f[u][0]=fa;
		for(int i=1;i<20;i++) f[u][i]=f[f[u][i-1]][i-1];
		for(int i=head[u];i;i=e[i].nxt)
		{
			int v=e[i].to;
			if(v==fa) continue;
			dfs(v,u);
			siz[u]+=siz[v];
		}
	}
	inline int lca(int x,int y)
	{
		if(dep[x]<dep[y]) swap(x,y);
		for(int i=19;~i;i--) if(dep[f[x][i]]>=dep[y]) x=f[x][i];
		if(x==y) return x;
		for(int i=19;~i;i--) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
		return f[x][0];
	}
	inline int kfa(int x,int y)
	{
		for(int i=19;~i;i--) if(dep[f[x][i]]>dep[y]) x=f[x][i];
		return x;
	}
}T[2];
int a[114514];
const int mod=998244353;
int ans;
signed main()
{
	freopen("tree.in","r",stdin);
	freopen("tree.out","w",stdout);
	n=read(),m=read();
	int r1,r2;
	for(int i=1;i<=n;i++) 
	{
		int x=read();
		if(!x) r1=i;
		else T[0].add_edge(x,i),T[0].add_edge(i,x);
	}
	for(int i=1;i<=m;i++)
	{
		int x=read();
		if(!x) r2=i;
		else T[1].add_edge(x,i),T[1].add_edge(i,x);
	}
	for(int i=1;i<=n;i++) a[i]=read();
	T[0].dfs(r1,0);T[1].dfs(r2,0);
	for(int i=1;i<=n;i++)
		for(int j=i+1;j<=n;j++)
		{
			int u=i,v=j;
			int Lca=T[0].lca(u,v);
			if(T[0].dep[u]>T[0].dep[v]) swap(u,v);
			int cnt=0;
			if(Lca==u) cnt=(n-T[0].siz[T[0].kfa(v,u)])*T[0].siz[v]%mod;
			else cnt=T[0].siz[u]*T[0].siz[v]%mod;
			ans=(ans+cnt*T[1].dep[T[1].lca(a[u],a[v])])%mod;
		}
	write(ans);
	return 0;
}

